open Eliom_lib
open Eliom_content
open Html5.D

module Tarotvweb_app =
  Eliom_registration.App (
      struct
	let application_name = "tarotvweb"
      end)

let () =
  Serveur_lwt_unix.init (Archiveur.archiver)
			
let main_service =
  Eliom_service.Http.service ~path:[] ~get_params:Eliom_parameter.unit ()

let service_recherche =
  Eliom_service.Http.service
    ~path:["recherche"]
    ~get_params:(Eliom_parameter.((int "page") ** (int "nombre")))
    ()

let service_partie =
  Eliom_service.Http.service
    ~path:["partie"]
    ~get_params:(Eliom_parameter.(int "id"))
    ()

let service_app =
  Eliom_service.App.service
    ~path:["jouer"]
    ~get_params:Eliom_parameter.unit
    ()

let () = Service_carte.register ()

let page_principale () =
  let contenu =
    let open Html5.F in
    (body [
	 div
	   [
	     pcdata "Vous pouvez " ;
	     a ~service:service_recherche
	       [pcdata "lister les parties"]
	       (0, 20) ;
	     pcdata ", consulter la ";
	     a ~service:(Eliom_service.static_dir ())
	       [pcdata "documentation de l'application"]
	       ["doc" ; "index.html"];
	     pcdata ", la ";
	     a ~service:(Eliom_service.static_dir ())
	       [pcdata "documentation de l'intelligence artificielle"]
	       ["doc_ia" ; "index.html"];
	     pcdata " ou tester le ";
	     a ~service:service_app
	       [pcdata "client web"]
	       ();
	     pcdata ".";
	   ] ;
	 h2 [pcdata "Le serveur de tarot est ouvert."]]
    )
  in
  Lwt.return
    (Eliom_tools.F.html
       ~title:"tarotvweb"
       ~css:[["css";"tarotvweb.css"]]
       contenu)
    
let page_recherche i_deb n =
  let date_of_float f =
    let tm = Unix.gmtime f in
    Printf.sprintf
      "%s %d %s %d %2d:%2d:%2d"
      (match tm.Unix.tm_wday with
       | 0 -> "dimanche"
       | 1 -> "lundi"
       | 2 -> "mardi"
       | 3 -> "mercredi"
       | 4 -> "jeudi"
       | 5 -> "vendredi"
       | 6 -> "samedi"
       | _ -> failwith "Ne peut arriver")
      tm.Unix.tm_mday
      (match tm.Unix.tm_mon with
       | 0 -> "janvier"
       | 1 -> "février"
       | 2 -> "mars"
       | 3 -> "avril"
       | 4 -> "mai"
       | 5 -> "juin"
       | 6 -> "juillet"
       | 7 -> "août"
       | 8 -> "septembre"
       | 9 -> "octobre"
       | 10 -> "novembre"
       | 11 -> "décembre"
       | _ -> failwith "Ne peut arriver")
      (tm.Unix.tm_year + 1900)
      tm.Unix.tm_hour
      tm.Unix.tm_min
      tm.Unix.tm_sec
  in
  let contenu liste_parties nombre_total =
    let nombre_pages = if nombre_total mod n = 0 then nombre_total / n
		       else (nombre_total / n) + 1 in
    let i_page = i_deb / n in
    let open Html5.F in
    (body[
	 nav [a ~service:main_service
		[pcdata "Accueil"] ()] ;
	 section
	   [
	     h1 [pcdata "Résultats de recherche"] ;
	     h2 [pcdata (Printf.sprintf "Page %d sur %d" (i_page + 1) nombre_pages)] ;
	     table
	       (tr [th [pcdata "Date"] ;
		    th [pcdata "Participants"]])
	       (List.map
		  (fun (id, date, participants) ->
		   let id = int_of_string id in
		   let date = date_of_float date in
		   let lien contenu =
		     a ~service:service_partie
		       contenu
		       id in
		   let cell_date = td [lien [pcdata date]] in
		   let cell_part = td [lien [pcdata participants]] in
		   tr [cell_date ; cell_part]
		  )
		  liste_parties
	       ) ;
	     div
	       [
		 p [a ~service:service_recherche
		      [pcdata "Retour à la page 1"]
		      (0, n)] ;
		 p [a ~service:service_recherche
		      [pcdata "Page précédente"]
		      (max 0 (i_page - 1), n)] ;
		 p [a ~service:service_recherche
		      [pcdata "Page suivante"]
		      (min (i_page + 1) (nombre_pages - 1), n)] ;
		 p [a ~service:service_recherche
		      [pcdata "Dernière page"]
		      (nombre_pages - 1, n)]
	       ]
	   ]
       ])
  in
  Lwt.bind (Archiveur.chercher 0. max_float [] i_deb n `DateC)
	   (fun (liste_parties, nombre_total) ->
	    Lwt.return (Eliom_tools.F.html
			  ~title:"tarotvweb"
			  ~css:[["css";"tarotvweb.css"]]
			  (contenu liste_parties nombre_total)))

let page_webclient () =
  let contenu =
    let open Html5.F in
    (body [
	 Webclient.make (fun x -> ignore {unit{Webclient.init %x}})
       ]
    )
  in
  Lwt.return
    (Eliom_tools.F.html
       ~title:"tarotvweb"
       ~css:[["css";"tarotvweb.css"]]
       contenu)  

let () =
  Eliom_registration.Html5.register
    ~service:service_recherche
    (fun (i_deb, n) () -> page_recherche (i_deb * n) n)

let () =
  Eliom_registration.Html5.register
    ~service:service_partie
    (fun id () ->
     Lwt.bind
       (Archiveur.retrouver id)
       (fun etats ->
	let partie = Partie_web.of_tarotv etats in
	let chtemeleu = Partie_web.to_html partie in
	Lwt.return (Eliom_tools.F.html
		      ~title:(Printf.sprintf "Partie %d" id)
		      ~css:[["css" ; "tarotvweb.css"]]
		      (body [chtemeleu]))))
    
let () =
  Eliom_registration.Html5.register
    ~service:main_service
    (fun () () ->
     page_principale ())

let () =
  Tarotvweb_app.register
    ~service:service_app
    (fun () () -> page_webclient ())
